"""
字符串
问题 : 给定一个字符串，找出其中不包含重复字符的最长子串的长度。例如，对于 “abcabcbb”，不包含重复字母的最长子串是 “abc”，其长度为 3。对于 “bbbbb”，最长子串是 “b”，长度为 1。

分析
题目意思是在一个字符串中找一个最长的子串(没有重复的字母)
在简单的思路 从左往右扩展子串,维持2个变量i和j来维持一个新的子串,j不断移动,每加入一个新的字符,判断是否有重复,如果有重复的,移动i生成新的子串
len = max(len,j-i+1)
这里有个问题 如何判断子串中是否有重复的字符串,传统思路是循环,但是每次查找重复的时间复杂度为o(n) 到时间长,可以使用 hashmap 来存 这样可以保证每次查找的效率

你已经实现了一个高效的解决方案，使用滑动窗口和哈希表来找出字符串中不包含重复字符的最长子串长度。以下是对你代码的简要说明和优化建议：
✅ 当前实现说明：
使用 char_map 字典记录每个字符最后一次出现的位置。
维护一个滑动窗口 [start, end] 来表示当前无重复字符的子串。
如果遇到重复字符且其上一次出现的位置在 start 之后，则更新 start 到该位置的后一位。
每次循环更新最大长度 max_len。
时间复杂度：O(n)，其中 n 是字符串长度，每个字符最多被访问一次。 空间复杂度：O(m)，m 为字符集大小（适用于 ASCII 或 Unicode）。

    @staticmethod
    def length_of_longest_substring(s: str) -> int:
        # char_map = {}  # 存储字符及其对应的下标
        char_index = [-1] * 128 # 存储字符及其对应的下标 如果输入是纯ASCII字符，可以使用数组代替字典
        max_len = 0  # 最大长度
        start = 0  # 滑动窗口的起始位置

        for end in range(len(s)):
            char = s[end]
            ascii_code = ord(char)
            if char_index[ascii_code]  >= start:
                start = char_index[ascii_code] + 1
            char_index[ascii_code] = end
            max_len = max(max_len, end - start + 1)
            # if char in char_map and char_map[char] >= start:
            #     # 如果字符已经存在，并且其位置在start之后，则更新start为该字符上一次出现的位置+1
            #     start = char_map[char] + 1
            # char_map[char] = end  # 更新字符的位置
            # max_len = max(max_len, end - start + 1)  # 计算当前窗口长度并更新最大值

        return max_len

问题 :给定一个字符串 S，找到 S 中最长的回文子串。你可以假设 S 的最大长度为 1000，并且存在一个唯一的最长回文子串。

"""
from sqlalchemy.sql.functions import current_date


class Solution:
    @staticmethod
    def longest_palindrome(s: str) -> str:
        if len(s) < 2:
            return s

        start = 0
        max_length = 1

        def expand_around_center(left: int,right:int):
            nonlocal start, max_length
            while left >=0 and right < len(s) and s[left] == s[right]:
                current_lenght = right - left + 1
                if current_lenght > max_length:
                    start = left
                    max_length = current_lenght
                left -= 1
                right += 1

        for i in range(len(s)):
            expand_around_center(i,i)
            expand_around_center(i,i+1)

        return s[start:start+max_length]


if __name__ == '__main__':
    sol = Solution()
    print(sol.longest_palindrome("babad"))  # 输出："bab" 或 "aba"
    print(sol.longest_palindrome("cbbd"))   # 输出："bb"
    print(sol.longest_palindrome("a"))      # 输出："a"
    print(sol.longest_palindrome("ac"))     # 输出："a" 或 "c"
